package com.flex.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.flex.exception.ResultCodeEnum;
import lombok.Data;
import java.io.Serializable;

/**
 * 属性私有化，构造器私有化，外部调用的方法为静态
 *
 * @param <T>
 */
@Data
public class BaseResult<T> implements Serializable {
    private static final long serialVersionUID = -4507574037830481719L;
    private static ObjectMapper objectMapper = new ObjectMapper();
    private String code;
    private T data;
    private String message;
    private boolean success;

    /**
     * 无参构造
     */
    private BaseResult() {
    }

    /**
     * 全参构造
     *
     * @param success：是否成功
     * @param data：返回的数据
     * @param code：返回的状态码
     * @param message：返回的信息
     */
    private BaseResult(boolean success, T data, String code, String message) {
        this.success = success;
        this.data = data;
        this.code = code;
        this.message = message;
    }

    /**
     * 业务正常返回业务代码：返回的数据为参数
     *
     * @param data：返回的数据
     * @param <T>：返回数据的类型
     * @return
     */
    public static <T> BaseResult<T> successResult(T data) {
        return new BaseResult<T>(true, data, ResultCodeEnum.SUCCTESS_RESULT_CODE.getCode(), ResultCodeEnum.SUCCTESS_RESULT_CODE.getMessage());
    }

    /**
     * 业务正常返回业务代码: 没有返回的数据
     *
     * @return
     */
    public static <T> BaseResult<T> successResult() {
        return new BaseResult<T>(true, null, ResultCodeEnum.SUCCTESS_RESULT_CODE.getCode(), ResultCodeEnum.SUCCTESS_RESULT_CODE.getMessage());
    }

    /**
     * 业务异常返回业务代码：返回的信息为参数
     *
     * @param <T>：返回数据的类型
     * @return
     */
    public static <T> BaseResult<T> errorResult(ResultCodeEnum resultCodeEnum) {
        return new BaseResult<T>(false, null, resultCodeEnum.getCode(), resultCodeEnum.getMessage());
    }

    /**
     * 业务异常返回业务代码：返回的信息为参数
     *
     * @param message：返回的提示信息
     * @param <T>：返回数据的类型
     * @return
     */
    public static <T> BaseResult<T> errorResult(String message) {
        return new BaseResult<T>(false, null, ResultCodeEnum.ERROR_RESULT_CODE.getCode(), message);
    }
}
